home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Tool Chest / Development Tools & Languages / Dylan Related / Marlais / MacMarlais 0.5.9d46 / Examples / Menus.dyl < prev    next >
Encoding:
Text File  |  1995-02-09  |  3.1 KB  |  131 lines  |  [TEXT/Mrls]

  1. module:            dylan-user
  2. author:            Patrick C. Beard <beard@cs.ucdavis.edu>
  3. synopsis:            classes for menus -- implementation.
  4.  
  5. /*
  6. define module Menus
  7.    use dylan, export: all;
  8.    export
  9.     <menu>,
  10.     
  11.     menu-dispose, menu-insert, menu-delete, menu-draw;
  12. end module Menus;
  13.  */
  14.  
  15. define variable *dylan-menus* = make(<table>);
  16.  
  17. define class <menu> (<object>)
  18.     slot title :: <string>,
  19.         required-init-keyword: title:;
  20.     slot id :: <small-integer>,
  21.         required-init-keyword: id:;
  22.     slot items :: <list>,
  23.         required-init-keyword: items:;
  24.     slot behavior :: <method>,
  25.         required-init-keyword: behavior:;
  26.     slot adjuster :: <method>,
  27.         init-value: #f,
  28.         init-keyword: adjuster:;
  29.     slot pointer :: union(<foreign-pointer>, singleton(#f));
  30.     slot inserted :: <boolean>;
  31. end class;
  32.  
  33. define method initialize (self :: <menu>, #key, #all-keys)
  34.     next-method();
  35.     self.pointer := %new-menu(self.title, self.id, self.items);
  36.     self.inserted := #f;
  37. end method;
  38.  
  39. define method menu-dispose (self :: <menu>)
  40.     if (self.pointer)
  41.         if (self.inserted)
  42.             menu-delete(self);
  43.         end if;
  44.         %dispose-menu(self.pointer);
  45.         self.pointer := #f;
  46.     end if;
  47. end method;
  48.  
  49. define method menu-insert (self :: <menu>)
  50.     if (self.pointer & ~self.inserted)
  51.         %insert-menu(self.pointer);
  52.         *dylan-menus*[self.title] := self;
  53.         self.inserted := #t;
  54.     end if
  55. end method;
  56.  
  57. define method menu-delete (self :: <menu>)
  58.     if (self.pointer & self.inserted)
  59.         %delete-menu(self.pointer);
  60.         *dylan-menus*[self.title] := #f;
  61.         self.inserted := #f;
  62.     end if;
  63. end method;
  64.  
  65. define method menu-draw ()
  66.     %draw-menus();
  67. end method;
  68.  
  69. define method menu-enable-item (self :: <menu>, item :: <string>)
  70.     if (self.pointer)
  71.         %set-item-states(self.pointer, list(item), #(#t));
  72.     end if;
  73. end method;
  74.  
  75. define method menu-disable-item (self :: <menu>, item :: <string>)
  76.     if (self.pointer)
  77.         %set-item-states(self.pointer, list(item), #(#f));
  78.     end if;
  79. end method;
  80.  
  81. // set a bunch of states at once.
  82.  
  83. define method menu-set-item-states(self :: <menu>, items :: <list>, states :: <list>)
  84.     if (self.pointer)
  85.         %set-item-states(self.pointer, items, states);
  86.     end if;
  87. end method;
  88.  
  89. // methods called by the system.
  90.  
  91. define constant dispatch-adjust-menus = method ()
  92.     for (menu in *dylan-menus*)
  93.         if (menu & menu.adjuster)
  94.             menu.adjuster(menu);
  95.         end if;
  96.     end for;
  97. end method;
  98.  
  99. define constant dispatch-menu-selection = method (title :: <string>, item :: <string>)
  100.     let menu = *dylan-menus*[title];
  101.     if (menu)
  102.         // invoke the menu item.
  103.         menu.behavior(menu, item);
  104.         // give the menu the chance to change state.
  105.         if (menu.adjuster)
  106.             menu.adjuster(menu);
  107.         end if;
  108.     end if;
  109. end method;
  110.  
  111. /*
  112.     define variable *beeper* = method(menu :: <menu>, item :: <string>)
  113.         beep();
  114.     end;
  115.     define variable *printer* = method(menu :: <menu>, item :: <string>)
  116.         princ(concatenate("selected “", item, "”"));
  117.     end;
  118.     define variable *menu* = make(<menu>, title: "Test", id: 1000,
  119.         items: #("Help", "Me", "Spock"), behavior: *printer*);
  120.     menu-insert(*menu*);
  121.     menu-draw();
  122.     // test out menu dispatching.
  123.     dispatch-menu-selection("Test", "Help");
  124.     dispatch-menu-selection("Test", "Me");
  125.     dispatch-menu-selection("Test", "Spock");
  126.     menu-delete(*menu*);
  127.     menu-draw();
  128.     menu-dispose(*menu*);
  129.     menu-draw();
  130. */
  131.